package top.hudk.tank.utils;

import top.hudk.tank.config.GameConfig;

import java.util.Random;

/**
 * 作用：
 *
 * @author hudk
 * @date 2020/9/9 21:43
 */
public class RandomUtil {

    private static Random random = new Random();

    private static Integer bigValue = Integer.MAX_VALUE;

    public static int randomInt(int i) {
        return random.nextInt(i);
    }

    public static int randomX() {
        return randomInt(GameConfig.GAME_WIDTH);
    }

    public static int randomY() {
        return randomInt(GameConfig.GAME_HEIGHT);
    }

    /**
     * 随机返回一个 boolean 值
     * 这个方法返回 true 的概率为 probability
     * @param probability 返回true的概率
     * @return 随机返回boolean值
     */
    public static boolean randomBoolean(double probability) {
        return randomInt(bigValue) > bigValue * (1 - probability);
    }

    /**
     * 返回一个概率值
     * @return 返回一个概率值
     */
    public static double getProbability() {
        return getProbability(GameConfig.CHANGE_DIRECTION);
    }

    /**
     * 根据指定的等级
     * 返回界面每次刷新时，发生某个事件的概率
     * @param i
     * @return
     */
    public static double getProbability(int i) {
        switch (i) {
            case 1:
                return 0.10 / GameConfig.FRAME_RATE;
            case 2:
                return 0.20 / GameConfig.FRAME_RATE;
            case 3:
                return 0.30 / GameConfig.FRAME_RATE;
            case 4:
                return 0.40 / GameConfig.FRAME_RATE;
            case 5:
                return 0.50 / GameConfig.FRAME_RATE;
            case 6:
                return 0.60 / GameConfig.FRAME_RATE;
            case 7:
                return 0.70 / GameConfig.FRAME_RATE;
            case 8:
                return 0.80 / GameConfig.FRAME_RATE;
            case 9:
                return 0.90 / GameConfig.FRAME_RATE;
            case 10:
                return 0.95 / GameConfig.FRAME_RATE;
        }
        return 0.001;
    }

    /**
     * 返回一个概率值
     * 这个概率表示：
     * 在指定的界面刷新帧率情况下，
     * 平均每经过 secondNumb 秒，
     * 事件就会发生一次
     * @param secondNumb 秒数
     * @return 一个概率值 小于1，大于0
     */
    public static double probability(int secondNumb) {
        return probability(secondNumb, GameConfig.FRAME_RATE);
    }

    /**
     * 返回一个概率值
     * 这个概率表示：
     * 在指定的界面刷新帧数情况下，
     * 平均每经过 secondNumb 秒，
     * 事件就会发生一次
     * @param secondNumb 秒数
     * @param frameRate 界面刷新的帧率
     * @return 一个概率值 小于1，大于0
     */
    public static double probability(int secondNumb, int frameRate) {
        int second = secondNumb;
        if(second < 0){
            second = 5;
        }
        return 1.0 / (second * frameRate);
    }

    /**
     * 平均每经过 secondNumb秒，就会返回一个 true
     * 只是一个概率事件，不代表经过 secondNumb 秒后一定返回 true
     * @param secondNumb 秒数
     * @return boolean
     */
    public static boolean returnTrueAfterSeconds(int secondNumb){
        return randomBoolean(probability(secondNumb));
    }




}
